﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoBastanteo.Dominio;
using ProyectoBastanteo.Persistencia;

namespace ProyectoBastanteo.Negocio
{
    public class AdministracionServiceImpl : IAdministracionService
    {


        #region Dependencias
        ClienteDAO ClieDAO = null;
        TipoempresaDAO tipEmpDAO = null;
        RepresentanteDAO RepreDAO = null;
        #endregion

        #region Operaciones de negocio
        public Cliente RegistrarCliente(string ruc, string razonSocial,int tipoCodigo,
            DateTime inicioOperaciones, int empleados)
        {
            // Excepción si falta algún dato requerido
            if (ruc == null || razonSocial == null || inicioOperaciones == null ||
                tipoCodigo <= 0 || empleados <= 0)
                throw new DatosInsufException("Faltan datos para crear cliente");
            // Excepción si ya se registrón el mismo cliente (por su RUC)
            if (ClieDAO.ObtenerPorRuc(ruc) != null)
               throw new EntidadRepetidaException("El cliente ya existe");
            // Creación del cliente
            Cliente clienteACrear = new Cliente();
            clienteACrear.rucclie = ruc;
            clienteACrear.razclie = razonSocial;
            clienteACrear.fecini = inicioOperaciones;
            clienteACrear.tipclie = tipEmpDAO.Obtener(tipoCodigo);
            clienteACrear.nroempl = empleados;
            return ClieDAO.Crear(clienteACrear);
        }
        
        public Representante RegistrarRepresentante(int codigo, string nombrep, string tidoprep, string nudorep, 
            string cargrep, string gruprep)
           {
            // Mensaje de Error si no se ingresan los datos requeridos 
            if (codigo <= 0 ||nombrep == null || tidoprep == null || nudorep == null ||
                cargrep == null || gruprep == null )
                throw new DatosInsufException("Faltan datos para registrar Representante");
            // Excepción si ya se registro el mismo representante para el cliente
            if (RepreDAO.ObtenerNudorep(codigo,tidoprep,nudorep) != null)
                throw new EntidadRepetidaException("El Representante ya existe");


            // Creación del Representante
            Representante RepresentanteACrear = new Representante();
            RepresentanteACrear.codclie = ClieDAO.Obtener(codigo);
            RepresentanteACrear.nombrep = nombrep;
            RepresentanteACrear.tidorep = tidoprep;
            RepresentanteACrear.nudorep = nudorep;
            RepresentanteACrear.cargrep = cargrep;
            RepresentanteACrear.gruprep = gruprep;
                      
            return RepreDAO.Crear(RepresentanteACrear);
        }


        public TipoEmpresa RegistrarTipoEmpresa(string Abreviacion)
        {
            // Excepción si falta algún dato requerido
            if (Abreviacion == null)
                throw new DatosInsufException("Faltan datos para crear TipoEmpresa");
            // Excepción si ya se registrón el mismo cliente (por su RUC)
            // if (tipoDAO.ObtenerDescrip(Abreviacion)!= null) 
            //   throw new EntidadRepetidaException("El TipoEmpresa ya existe");

            // Creación del TipoEmpresa
            TipoEmpresa tipoACrear = new TipoEmpresa();
            tipoACrear.Abreviacion = Abreviacion;
            return tipEmpDAO.Crear(tipoACrear);
        }

        #endregion

        
        #region Métodos de soporte para entidad Cliente
        public Cliente ObtenerCliente(int codigo)
        {
            return ClieDAO.Obtener(codigo);
        }

        public Cliente ModificarCliente(Cliente ClienteAModificar)
        {
            return ClieDAO.Modificar(ClienteAModificar);
        }
        public void EliminarCliente(Cliente ClienteAEliminar)
        {
            ClieDAO.Eliminar(ClienteAEliminar);
        }

        
        public ICollection<Cliente> ListarClientes()
        {
            return ClieDAO.ListarTodos();
        }
        #endregion

        #region Métodos de soporte para entidad TipoEmpresa

        public TipoEmpresa ObtenerTipoEmpresa(int codigo)
        {
            return tipEmpDAO.Obtener(codigo);
        }
        public TipoEmpresa ModificarTipoEmpresa(TipoEmpresa TipoEmpresaAModificar)
        {
            return tipEmpDAO.Modificar(TipoEmpresaAModificar);
        }
        public void EliminarTipoEmpresa(TipoEmpresa TipoEmpresaAEliminar)
        {
            tipEmpDAO.Eliminar(TipoEmpresaAEliminar);

        }

        
        public ICollection<TipoEmpresa> ListarTiposEmpresa()
        {
            return tipEmpDAO.ListarTodos();
        }
        #endregion
               
        #region Métodos de soporte para entidad Representante

        public Representante ModificarRepresentante(Representante RepresentanteAModificar)
        {
            return RepreDAO.Modificar(RepresentanteAModificar);
                
        }
        public void EliminarRepresentante(Representante RepresentanteAEliminar)
        {
            RepreDAO.Eliminar(RepresentanteAEliminar);
        }


        public Representante ObtenerRepresentante(string nudorep)
        {
            return RepreDAO.Obtener(nudorep);
        }
        public ICollection<Representante> ListarRepresentantes()
        {
            return RepreDAO.ListarTodos();
        }
        #endregion
        
    }
}